local ngx = require "ngx";
local cjson = require "cjson"
local base64 = require "ngx.base64"
local redisClient = require "hgg-lua.readRedis"

local logs_data = ngx.shared.logs_data;

if ngx.var.uri ~= "/token" and ngx.var.uri ~= "/verify" then
    local logsTable={};
    -- 3.请求服务域名
    logsTable["requestServerName"] =ngx.var.server_name;
    -- 4.请求服务地址
    logsTable["requestUrl"] =ngx.var.request;
    -- 5.请求Parmas参数
    logsTable["reqParams"] =ngx.var.args;
    --6.请求体数据（2KB以内JSON）
    logsTable["reqBody"]=ngx.ctx.reqBody;
     -- 7.请求数据长度（含头）
    logsTable["reqDataLength"] =ngx.var.request_length;
    -- 8.响应数据长度
    logsTable["resDataLength"] =ngx.var.body_bytes_sent;
     -- 9.请求服务时间（到毫秒）
    logsTable["requestTime"] =ngx.now()*1000;
    -- 10.请求响应时长（毫秒）
    logsTable["resTime"] =ngx.var.request_time*1000;
    -- 11.后端消耗时长（毫秒）
    local serverResTime=ngx.var.upstream_response_time
    if not serverResTime then
        serverResTime=0
    end
    logsTable["serverResTime"] =serverResTime*1000;
     -- 12.客户端浏览器信息
    logsTable["clientAgent"] =ngx.var.http_user_agent;
    -- 13.客户端IP地址
    logsTable["clientIp"] =ngx.var.realip_remote_addr;
    -- 14.处理服务器IP
    logsTable["serverIp"] =ngx.var.upstream_addr;
    -- 16.响应状态
    logsTable["resStatus"] =ngx.var.status;
    -- 17.请求头
    logsTable["reqHeaders"] =cjson.encode(ngx.req.get_headers());
    -- 18.响应头
    logsTable["resHeaders"] =cjson.encode(ngx.resp.get_headers());
    -- 19.响应体(2KB以内JSON）
    if not ngx.ctx.resBody then
        logsTable["resBody"] ="";
    else
        logsTable["resBody"] =ngx.ctx.resBody;
    end
    -- 20.业务事件流水号
    logsTable["bizEventId"] ="";
    -- 21.业务主数据类型
    logsTable["mdTypeCode"] ="";
    -- 22.业务主数据ID
    logsTable["mdId"] ="";
    local tokenInfo=ngx.ctx.reqClientInfo;
    if tokenInfo then
        local tokeJson=cjson.decode(ngx.ctx.reqClientInfo);
        -- 23.调用租户ID
        logsTable["tenantId"] =tokeJson["data"]["tenantKey"];
        --24.调用租户名称
        logsTable["tenantName"] =tokeJson["data"]["tenantName"];        
        -- 27.调用客户端ID
        logsTable["callClientId"] =tokeJson["data"]["clientId"];
        -- 28.调用客户端名称
        logsTable["callClientName"] =tokeJson["data"]["clientName"];
        -- 29.调用服务真实地址（去处url路径参数后地址）
        logsTable["callServiceRealUrl"] =tokeJson["data"]["requestRealUrl"];
        if tokeJson["code"]~=200 then
            logsTable["optStatus"] =tokeJson["code"];
            logsTable["optReson"] =tokeJson["message"].."=>"..tokeJson["errMessage"];
        elseif not tokeJson["data"]["verify"] then
            logsTable["optStatus"] ="402";
            logsTable["optReson"] ="Token验证失败";
        elseif not tokeJson["data"]["permsVerify"] then
            logsTable["optStatus"] ="403";
            logsTable["optReson"] ="权限验证失败";
        else
            logsTable["optStatus"] ="200";
            logsTable["optReson"] ="服务调阅成功";
        end
    end
    logs_data:set("row"..ngx.time(),cjson.encode(logsTable));
end


